#include<iostream>
//奇异递归 实现多态是没有成本的
template<typename T>
class Animal
{
public:
    void speak()
    {
        //将父类转化成子类指针
        ((T*)this)->speak();
    }
};
class Dog:public Animal<Dog>
{


public:
    void speak()
    {
        std::cout<<"汪汪汪"<<std::endl;
    }
};
class Cat:public  Animal<Cat>
{
public:
    void speak()
    {
        std::cout<<"喵喵喵"<<std::endl;
    }
};
template<typename T>
void speak(Animal<T>&a)
{
    a.speak();
}

int main()
{
  Dog d;
  Cat c;
  speak(d);
  speak(c);
  //空类至少占一个字节，因为可以构建。结构体不占字节，

    return 0;
}